//
//  CZStatus.swift
//  crkWeibo
//
//  Created by 陈荣科 on 15/12/22.
//  Copyright © 2015年 crk. All rights reserved.
//

import UIKit
import SDWebImage

class CZStatus: NSObject {

    ///1.定义模型属性
    //MARK: - 属性
    //创建时间
    var created_at: String?
    
    ///微博id
    var id:Int = 0
    
    ///微博正文内容
    var text: String?
    
    ///来源
    var source: String?
    
    ///微博的配图[String: AnyObject]
    var pic_urls: [[String: AnyObject]]? {
    
        didSet{
        
            let count = pic_urls?.count ?? 0
            //判断有没有图片
            if count == 0 {
            //没有图片
                return
            }
            //创建空数组
            storePictureURLs = [NSURL]()
            
            //遍历所有字典
            for dict in pic_urls!{
                
                let  urlStr = dict["thumbnail_pic"] as! String
                //转成NSURL
                let url = NSURL(string: urlStr)!
                storePictureURLs?.append(url)
            }
        }
    }
    
    ///微博配图的URL数组 （原创微博的URL）
    var storePictureURLs: [NSURL]?
    
    /// 如果是原创微博，显示原创微博的图片；如果是转发微博，显示转发微博的图片
    var pictureURLs: [NSURL]? {
    
       return retweeted_status == nil ? storePictureURLs : retweeted_status?.storePictureURLs
    }
    
    ///转发数
    var reposts_count: Int = 0
    
    ///评论数
    var comments_count: Int = 0
    
    ///表态数(赞)
    var attitudes_count: Int = 0
    
    ///被转发的模型
    var retweeted_status: CZStatus?
    
    ///用户模型
    var user: CZUser?
    
    ///cell的行高，缓存行高
    var height: CGFloat?
    
    ///根据模板的不同返回不同的cell的标识
    func cellId()->String{
        
       return retweeted_status == nil ? CZStatusCellReuseIdentifier.StatusNormalCell.rawValue : CZStatusCellReuseIdentifier.StatusForwardCell.rawValue
    }
    
    //字典转模型
    init(dict: [String: AnyObject]) {
        //在init之前能赋值的属性，就可以不加?
        super.init()
        
        //使用KVC来赋值所有属性，KVC是一个方法，方法是只有在对象初始化完毕之后才嫩调用
        setValuesForKeysWithDictionary(dict)
    }
    
    //setValuesForKeysWithDictionary传入的key又多少就会调用多少次，并且传入相应的key和value
    override func setValue(value: AnyObject?, forKey key: String) {
//        print("key:\(key)")
        //判断如果是user这个key，我们自己来字典转模型，不需要kvc
        if key == "user"{
        
            if let dict = value as? [String: AnyObject]{
                let userModel = CZUser(dict: dict)
                
                //将模型赋值给user属性
                self.user = userModel
            }
        
            return
        }
        //如果key是retweeted_status我们将字典转化成模型
        if key == "retweeted_status" {
        
            //我们自己字典转模型
            if let dict = value as? [String: AnyObject] {
            
                //字典转模型
                retweeted_status = CZStatus(dict: dict)
                
                 print("碰到被转发微博: \(retweeted_status)")
            }
            return
        }
        

        super.setValue(value, forKey: key)
    }
    
    //字典的key在模型中招不到对应的属性，需要实现forUnderfinedKey
    override func setValue(value: AnyObject?, forUndefinedKey key: String) {}
    
    //实现description属性
   override var description: String{
     let prop = ["created_at", "id", "text", "source", "pic_urls", "reposts_count", "comments_count", "attitudes_count","user","retweeted_status"]
    
    let dict = dictionaryWithValuesForKeys(prop)
    
       return "\n\t微博模型:\(dict)"
    }
    
    //MARK: - 加载微博数据
    class func mLoadStatus(since_id: Int, max_id: Int,finished:(statuses: [CZStatus]?, error: NSError?)-> ()){
    
        //直接用网络工具类方法来加载微博数据
        CZNetworkTool.sharedInstance.loadStatus(since_id, max_id: max_id) { (result, error) -> () in
            if error != nil || result == nil{
                //没有加载到数据
                finished(statuses: nil, error: error)
                return
            }
            
            //没有错误，有数据
            //字典转模型，判断字典是否有statuses，将statuses的值转成数组，数组存放的是字典
            if let array = result?["statuses"] as? [[String: AnyObject]] {
                //能获取到微博数据
                
                //创建一个数组，来存放转好的模型
                var statuses = [CZStatus]()
                
                //遍历数组
                for dict in array {
                
                    //获取字典，字典转模型
                    let status = CZStatus(dict: dict)
                    statuses.append(status)
                
                }
                //下载图片
                cachedWebImage(statuses, finished: finished)
                
                //所有的模型都转完成，就告诉调用的人有微博模型数据了
//                finished(statuses: statuses, error: nil)
                
            }else{
            
                finished(statuses: nil, error: error)
                return
            
            }
    
        }
    
    }
    
    ///类方法只能调用类方法，不能调用对象方法
    ///缓存图片
    class func cachedWebImage(statuses: [CZStatus],finished:(statuses: [CZStatus]?,error: NSError?)->()) {
        
        //缓存图片的大小
        var length = 0.0
        
        //创建任务组
        let group = dispatch_group_create()
        
        //1.遍历所有模型
        for status in statuses {
            
            //2、判断模型是否有图片
            guard let urls = status.pictureURLs else{
                
                //没有图片要缓存，跳到下一个模型
                continue
            }
            
            //只要判断只有一张图片就行了
            //有图片，遍历缓存所有图片
            if urls.count == 1 {
                let url = urls[0]
                //SdWebImageManager缓存图片，是一个异步的任务
                //在异步任务之前进入组
                dispatch_group_enter(group)
                SDWebImageManager.sharedManager().downloadImageWithURL(url, options: SDWebImageOptions(rawValue: 0), progress: nil, completed: { (image, error, _, _, _) -> Void in
                    //只有异步任务完成就离开组
                    dispatch_group_leave(group)
                    
                    if error != nil {
                        print("缓存图片失败:\(url)")
                        return
                    }
                    
                    print("缓存图片成功:\(url)")
                    
                    let data = UIImagePNGRepresentation(image)!
                    
                    length += Double(data.length)
                })
            }
        }
        
        //在所有的异步任务完成后再来执行
        dispatch_group_notify(group, dispatch_get_main_queue()) { () -> Void in
            print("所有图片下载完成，大小:\(length / 1024 / 1024) M")
            //通知别人，获取到所有的微博，调用闭包
            finished(statuses: statuses, error: nil)
        }
    }

    
}






